//
`define     RESET_PC                                63'b0
//
`define     ENABLE                                  01'b1
`define     DISABLE                                 01'b0
// opcode type
`define     OPCODE_LOAD                             05'b00000
`define     OPCODE_LOAD_FP                          05'b00001
`define     OPCODE_MISC_MEM                         05'b00011
`define     OPCODE_OP_IMM                           05'b00100
`define     OPCODE_AUIPC                            05'b00101
`define     OPCODE_OP_IMM_32                        05'b00110
`define     OPCODE_STORE                            05'b01000
`define     OPCODE_STORE_FP                         05'b01001
`define     OPCODE_AMO                              05'b01011
`define     OPCODE_OP                               05'b01100
`define     OPCODE_LUI                              05'b01101
`define     OPCODE_OP_32                            05'b01110
`define     OPCODE_MADD                             05'b10000
`define     OPCODE_MSUB                             05'b10001
`define     OPCODE_NMSUB                            05'b10010
`define     OPCODE_NMADD                            05'b10011
`define     OPCODE_OP_FP                            05'b10100
`define     OPCODE_BRANCH                           05'b11000
`define     OPCODE_JALR                             05'b11001
`define     OPCODE_JAL                              05'b11011
`define     OPCODE_SYSTEM                           05'b11100
// instr type
`define     INSTR_ILLEGAL                           21'b0_0000_0000_0000_0000_0000
`define     INSTR_LOAD                              21'b0_0000_0000_0000_0000_0001
`define     INSTR_LOAD_FP                           21'b0_0000_0000_0000_0000_0010
`define     INSTR_MISC_MEM                          21'b0_0000_0000_0000_0000_0100
`define     INSTR_OP_IMM                            21'b0_0000_0000_0000_0000_1000
`define     INSTR_AUIPC                             21'b0_0000_0000_0000_0001_0000
`define     INSTR_OP_IMM_32                         21'b0_0000_0000_0000_0010_0000
`define     INSTR_STORE                             21'b0_0000_0000_0000_0100_0000
`define     INSTR_STORE_FP                          21'b0_0000_0000_0000_1000_0000
`define     INSTR_AMO                               21'b0_0000_0000_0001_0000_0000
`define     INSTR_OP                                21'b0_0000_0000_0010_0000_0000
`define     INSTR_LUI                               21'b0_0000_0000_0100_0000_0000
`define     INSTR_OP_32                             21'b0_0000_0000_1000_0000_0000
`define     INSTR_MADD                              21'b0_0000_0001_0000_0000_0000
`define     INSTR_MSUB                              21'b0_0000_0010_0000_0000_0000
`define     INSTR_NMSUB                             21'b0_0000_0100_0000_0000_0000
`define     INSTR_NMADD                             21'b0_0000_1000_0000_0000_0000
`define     INSTR_OP_FP                             21'b0_0001_0000_0000_0000_0000
`define     INSTR_BRANCH                            21'b0_0010_0000_0000_0000_0000
`define     INSTR_JALR                              21'b0_0100_0000_0000_0000_0000
`define     INSTR_JAL                               21'b0_1000_0000_0000_0000_0000
`define     INSTR_SYSTEM                            21'b1_0000_0000_0000_0000_0000
//  x0寄存器
`define     ZERO_REG                                05'b0                                   
//  操作数选择
`define     OPERAND1_GPR                            01'b0
`define     OPERAND1_PC                             01'b1
`define     OPERAND2_GPR                            01'b0
`define     OPERAND2_IMM                            01'b1
//  进入ALU的操作数是已经选择好的，因此不需要区分op和op_imm，op_32和op_imm_32。
`define     ALU_NOP                                 11'b000_0000_0000
`define     ALU_ADD                                 11'b000_0000_0001
`define     ALU_SUB                                 11'b000_0000_0010
`define     ALU_SLT                                 11'b000_0000_0100
`define     ALU_SLTU                                11'b000_0000_1000
`define     ALU_XOR                                 11'b000_0001_0000
`define     ALU_OR                                  11'b000_0010_0000
`define     ALU_AND                                 11'b000_0100_0000
`define     ALU_SHIFT                               11'b000_1000_0000
`define     ALU_ADDW                                11'b001_0000_0000
`define     ALU_SUBW                                11'b010_0000_0000
`define     ALU_SHIFTW                              11'b100_0000_0000
//  MDU_OP  最高位为word操作标志
`define     MDU_MUL                                 9'b0_0000_0001
`define     MDU_MULH                                9'b0_0000_0010
`define     MDU_MULHSU                              9'b0_0000_0100
`define     MDU_MULHU                               9'b0_0000_1000
`define     MDU_DIV                                 9'b0_0001_0000
`define     MDU_DIVU                                9'b0_0010_0000
`define     MDU_REM                                 9'b0_0100_0000
`define     MDU_REMU                                9'b0_1000_0000
`define     MULW                                    9'b1_0000_0001
`define     DIVW                                    9'b1_0001_0000
`define     DIVUW                                   9'b1_0010_0000
`define     REMW                                    9'b1_0100_0000
`define     REMUW                                   9'b1_1000_0000


//  派遣目的单元
`define     DISP_NOP                                4'b0000
`define     DISP_ALU                                4'b0001
`define     DISP_MDU                                4'b0010
`define     DISP_LSU                                4'b0100
`define     DISP_FPU                                4'b1000

`define     BUBBLE                                  32'h00000013
//  

//  mstatus
`define     MPIE                                    mstatus[07]
`define     MIE                                     mstatus[03]
`define     MPP                                     mstatus[12:11]
// mie
`define     MEIE                                    mie[11]
`define     MSIE                                    mie[03]
`define     MTIE                                    mie[07]
// mip
`define     MEIP                                    mip[11]
`define     MSIP                                    mip[03]
`define     MTIP                                    mip[07]